<?php
/**
 * 装饰模式
 *
 * 在不创造更多子类的情况下，将对象的功能加以扩展。
 */
//抽象构件角色
abstract class Component{
	//规范的方法
	abstract public function Operation();
}
//定义一个将要接收附加责任的类
class ConcreteComponent extends Component{
	protected $name = 'con';
	//实现的方法
	public function Operation()
	{
		echo "ConcreteComponent Operation\n";
	} 
}
//装饰角色
abstract class Decorator extends Component{
	//抽象构件角色的实例
	protected $component;
	//设置实例
	public function setComponent(Component $component)
	{
		$this->component = $component;
	}
	//执行构件角色的方法
	public function Operation()
	{
		if($this->component instanceof Component)
		{
			$this->component->Operation();
		}
	}
}
//负责给对象添加责任的类A
class ConcreteDecoratorA extends Decorator{
	//A添加的属性
	private $addedState;

	public function Operation()
	{
		//执行原先的方法
		parent::Operation();
		//设置A扩展的属性
		$this->addedState = "new A state\n";
		echo $this->addedState;
	}
}
//负责给对象添加责任的类B
class ConcreteDecoratorB extends Decorator{

	public function Operation()
	{
		//执行原先的方法
		parent::Operation();
		//执行B扩展的方法
		$this->addBehavior();
	}

	public function addBehavior()
	{
		echo "B addBehavior";
	} 
}

//被扩展方法的原对象c
$c = new ConcreteComponent();
//A扩展C
$a = new ConcreteDecoratorA();
$a->setComponent($c);
//B扩展A
$b = new ConcreteDecoratorB();
$b->setComponent($a);
//检验扩展结果
$b->Operation();

